home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr48 / 386p_200.zip / PIX.ASM < prev    next >
Assembly Source File  |  1995-01-12  |  6KB  |  254 lines

  1.  
  2.  
  3. ; _Pix
  4. ; _Line
  5. ; _Block
  6. ; _Rectangle
  7. ; _ScrClr
  8.         .386P
  9. code32 segment para public use32
  10.        assume cs:code32,ds:code32
  11. NOJUMPS
  12. NOSMART
  13. include 386video.inc
  14.  
  15.  
  16.         public _Pix
  17. _Pix:
  18.         ; edi= scr dest
  19.         ; eax= x in pixels
  20.         ; edx= y in pixels
  21.         ; cl= color
  22.         
  23.         push edi 
  24.         add edi,[edx*4+_RowStart]
  25.         add edi,eax
  26.         mov [edi],cl
  27.         pop edi
  28.     ret
  29.  
  30. ; _Line drawing code starts here
  31. ;       the _Line routine is based on the Bresenham algorithm
  32. ;       with optimized vertical,horizontal and diagonal subcases
  33.  
  34. vline:  mov ebp,_ScrX
  35.         add edi,[edx*4+_RowStart]
  36.         sub edx,ebx
  37.         jg yypos
  38.         neg ebp
  39.         neg edx
  40. yypos:  mov eax,esi
  41. vlinea: mov [edi],al
  42.         add edi,ebp
  43.         dec edx
  44.         jne vlinea
  45.         popad
  46.         ret
  47.  
  48. hline:  mov ecx,eax
  49.         mov eax,esi
  50.         inc ecx
  51.         shr ecx,1
  52.         jnc nobyte
  53.         stosb
  54. nobyte: shr ecx,1
  55.         jnc noword
  56.         stosw
  57. noword: jecxz gloom
  58.         rep stosd
  59. gloom:  popad
  60.         ret
  61. diagline:
  62.         inc ebp ; increment x,y
  63. diaglup:
  64.         mov [edi],al
  65.         add edi,ebp
  66.         dec edx
  67.         jne diaglup
  68.         mov [edi],al
  69.         popad
  70.         ret
  71.  
  72. yline:  mov ebx,edx
  73.         xchg esi,eax
  74.         lea ecx,[edx+1] ; deltay +1
  75.         neg edx ; initial accumulator
  76.         shl ebx,1 ; recharge = deltay*2
  77. xinc:   sub edx,ebx ; recharge
  78. yinc:   mov [edi],al
  79.         add edi,ebp ; newline
  80.         dec ecx
  81.         je end_y
  82.         add edx,esi ; increment
  83.         jl yinc
  84.         inc edi
  85.         jmp short xinc
  86.  
  87. end_t:  mov [edi+1],ax
  88. end_b:  mov [edi],al
  89. end_y:  popad
  90.         ret
  91. end_w:  mov [edi],ax
  92.         popad
  93.         ret
  94. end_d:  mov [edi],eax
  95.         popad
  96.         ret
  97.  
  98.         public _Line
  99. _Line:  ; edi =scr dest
  100.         ; eax,edx = x1,y1    signed dwords!!!!!
  101.         ; ecx,ebx = x2,y2
  102.         ; esi = colour
  103.         pushad
  104.         add edi,eax
  105.         mov ebp,_ScrX ;y increment
  106.         ; x increment is always positive
  107.         sub eax,ecx ; delta x
  108.         je vline
  109.         jg xpos
  110.         sub edi,eax
  111.         xchg edx,ebx
  112.         neg eax
  113. xpos:   add edi,[edx*4+_RowStart]
  114.         sub edx,ebx ; delta y
  115.         je hline
  116.         jg ypos
  117.         neg ebp
  118.         neg edx
  119. ypos:   cmp eax,edx
  120.         je diagline ; deltax = deltay
  121.         jl yline  ; y is indipendent var
  122.         ; else x is indipendent var
  123. xline:  mov ebx,eax
  124.         lea ecx,[eax+1]  ; x pixels to blit
  125.         xchg esi,eax
  126.         ; edx = accumulator increment
  127.         shl ebx,1 ; recharge = 2*deltax
  128.         neg esi ; accumulator = -deltax
  129. blitb:  dec ecx
  130.         je end_b
  131.         add esi,edx ;advance
  132.         jge put_b
  133.         dec ecx
  134.         je end_w
  135.         add esi,edx
  136.         jge put_w
  137.         dec ecx
  138.         je end_t
  139.         add esi,edx
  140.         jge put_t
  141.         dec ecx
  142.         je end_d
  143.         add esi,edx
  144.         je put_d
  145.         ; well, 4 dots in a row
  146.         stosd
  147.         jmp short blitb
  148.  
  149. put_b:  mov [edi],al
  150.         sub esi,ebx ; recharge
  151.         lea edi,[edi+ebp+1]
  152.         jmp short blitb
  153. put_w:  mov [edi],ax
  154.         sub esi,ebx ; recharge
  155.         lea edi,[edi+ebp+2]
  156.         jmp short blitb
  157. put_t:  mov [edi],ax
  158.         mov [edi+2],al
  159.         sub esi,ebx ; recharge
  160.         lea edi,[edi+ebp+3]
  161.         jmp short blitb
  162. put_d:  mov [edi],eax
  163.         sub esi,ebx ; recharge
  164.         lea edi,[edi+ebp+4]
  165.         jmp short blitb
  166.  
  167. ; ==========================================================================
  168. ;
  169. ; BLOCK BLITTING FUNCTIONS
  170. ;
  171. ; ==========================================================================
  172.  
  173.         public _Block
  174.  
  175. _Block:
  176.         ; blit a single color block on screen
  177.         ;edi = screen base offset
  178.         ;eax = x position in pixels
  179.         ;edx = y position in pixels
  180.         
  181.         ;ecx = block width in nudgets
  182.         ;ebx = block height in pixels
  183.         ;esi = color pattern  (all 4 bytes are used)
  184.  
  185.         pushad
  186.         
  187.         add edi,eax                   ;
  188.         add edi,[edx*4 + _RowStart]   ; edi = upper-left block corner
  189.         
  190.         mov edx,ecx       ;edx = x width in nudgets
  191.         mov eax,esi
  192.         shl ecx,2
  193.         mov esi,_ScrX
  194.         sub esi,ecx
  195. @zblock:
  196.         mov ecx,edx
  197.         rep stosd ; ZOOM! Thundering speed!
  198.         add edi,esi ; next line
  199.         dec ebx
  200.         jne @zblock
  201.         
  202.         popad
  203.     ret
  204.  
  205.  
  206.         public _ScrClr
  207. _ScrClr:
  208.         ; clears screen using the color contained into eax
  209.         push ecx
  210.         push edi
  211.         mov ecx,_ScrSD
  212.         mov edi,_ScrBase
  213.         rep stosd
  214.         pop edi
  215.         pop ecx
  216.         ret
  217.  
  218.  
  219.         public _Rectangle
  220.  
  221. _Rectangle:
  222.         ; blit a single color block on screen
  223.         ;edi = screen base offset
  224.         ;eax = x position in pixels
  225.         ;edx = y position in pixels
  226.         
  227.         ;ecx = block width  in  pixels
  228.         ;ebx = block height in pixels
  229.         ;esi = color pattern  (only lower byte used)
  230.  
  231.         pushad
  232.         
  233.         add edi,eax                   ;
  234.         add edi,[edx*4 + _RowStart]   ; edi = upper-left block corner
  235.         
  236.         mov edx,ecx       ;edx = x width in nudgets
  237.         mov eax,esi
  238.         mov esi,_ScrX
  239.         sub esi,ecx
  240. @zrec:
  241.         mov ecx,edx
  242.         rep stosb   ; ZOOM! Thundering speed!
  243.         add edi,esi ; next line
  244.         dec ebx
  245.         jne @zrec
  246.         
  247.         popad
  248.     ret
  249.  
  250. code32 ends
  251.  
  252.  END
  253.  
  254.